package com.miguo.utils;

import android.content.Context;
import android.text.TextUtils;

import com.alibaba.sdk.android.util.NetworkUtils;
import com.miguo.app.AppConfig;
import com.miguo.app.AppContext;
import com.miguo.bean.CommentBean;
import com.miguo.bean.ConfigBean;
import com.miguo.db.ConfigDB;
import com.miguo.framework.request.JsonData;
import com.miguo.framework.request.RequestJsonHandler;
import com.miguo.framework.utils.Log;
import com.miguo.http.HttpClient;
import com.miguo.http.Url;

import java.util.List;

/**
 * File Names: Config
 * Describe:
 * User: LinXiaoZhi(87100854@qq.com)
 * Date: 2015-11-05
 * Time: 00:26
 */
public class ConfigInfo {

    public interface OnConfigChangedListener {

        void onAdvertChanged();

        void onAdvertUnchanged();

        void onCategoryChanged();
    }

    public static boolean IsRequestConfigData = false;//是否请求了配置数据

    private Context mContext;

    private static ConfigInfo instance;

    private boolean isUpdate = false;

    private OnConfigChangedListener listener;

    private ConfigInfo(Context context) {
        this.mContext = context;
    }

    public void setOnConfigChangedListener(OnConfigChangedListener listener) {
        this.listener = listener;
    }

    public static ConfigInfo getInstance(Context context) {
        if (instance == null) {
            instance = new ConfigInfo(context);
        }
        return instance;
    }

    /**
     * 处理配置信息，如果发现其中的验证信息不对，则重新获取
     */
    public void startConfigInfo() {
        RequestJsonHandler handler = new RequestJsonHandler() {
            @Override
            public void onRequestFinish(JsonData json) {
                if (json.optInt("status") == 200) {
                    Log.i("config:" + json.toString());
                    ConfigDB configDb = ConfigDB.getInstance(mContext);//数据库操作对象
                    int configVer = AppContext.Prefs().getConfigVer();
                    JsonData data = json.optJson("data");
                    JsonData config = data.optJson("config");
                    int ver = data.optInt("ver");
                    if (ver > configVer) {
                        List<ConfigBean> ConfigData = CommentBean.ConfigData(config);
                        /*** start  2016-03-09 coding **/
                        if (listener != null) {
                            if (ConfigData != null && ConfigData.size() > 0) {
                                for (ConfigBean item : ConfigData) {
                                    String configName = item.getName().toLowerCase();
                                    String configValue = item.getData();
                                    String saveConfigValue = configDb.findValue(item.getName());
                                    if (configName.equals("advert_ver")) {
                                        if (!configValue.equals(saveConfigValue))
                                            listener.onAdvertChanged();
                                        else
                                            listener.onAdvertUnchanged();
                                    } else if (configName.equals("category_ver")) {
                                        if (!configValue.equals(saveConfigValue))
                                            listener.onCategoryChanged();
                                    } else if (configName.equals("search_url")) {
                                        AppConfig.TAOCONFIG.SEARCH = !configValue.equals(saveConfigValue) ? configValue
                                                : (TextUtils.isEmpty(saveConfigValue) ? AppConfig.TAOCONFIG.SEARCH : saveConfigValue);
                                    } else if (configName.equals("inner_page_type")) {
                                        AppContext.GlobalJumpType = !TextUtils.isEmpty(configValue) ? Integer.valueOf(configValue) : 1;
                                    }
                                }
                                IsRequestConfigData = true;//已经请求了配置数据
                            }
                        }

                        /*** end  2016-03-09 coding **/

                        ConfigDB.getInstance(mContext, false).deleteAll();
                        ConfigDB.getInstance(mContext, false).saveList(ConfigData);

                        AppContext.Prefs().setConfigVer(ver);
                        isUpdate = true;
                    }

                    //由于Application中的AppContext.init函数可能不再执行，此处用于获取已经保存的值[2016-04-27 15:48]
                    String searchUrl = configDb.findValue("search_url");
                    String jumpType = configDb.findValue("inner_page_type");
                    if(!TextUtils.isEmpty(searchUrl))
                        AppConfig.TAOCONFIG.SEARCH = searchUrl;
                    if(!TextUtils.isEmpty(jumpType))
                        AppContext.GlobalJumpType = Integer.valueOf(jumpType);
                }

            }
        };
        Log.i("config:" + Url.toRoute(Url.Config.Init, 1));

        HttpClient.post(Url.toRoute(Url.Config.Init, 1), handler);
    }

    /** 开始数据配置操作请求 **/
    public static void startConfigRequest(final Context mContext){
        if(NetworkUtils.isNetworkAvaiable(mContext)) {//如果网络可用是才开始写配置，不然会一直请求不到数据
            final int VersionMark = CommonUtils.getVersionCode(mContext);
            final boolean isVersionMark = VersionMark > AppContext.Prefs().getVersionMark();
            //处理App配置
            ConfigInfo configInfo = ConfigInfo.getInstance(mContext);
            configInfo.setOnConfigChangedListener(new ConfigInfo.OnConfigChangedListener() {
                @Override
                public void onAdvertChanged() {
                    // 加载广告
                    //广告数据加载成功后会记录一次版本，如果无变化也会记录一次版本数据，这样可以保证在第一次加载时记录了但是数据没请求成功，第二次就不获取数据了
                    Advert.getInstance(mContext, isVersionMark).init();
                }

                @Override
                public void onAdvertUnchanged() {
                    AppContext.Prefs().setVersionMark(CommonUtils.getVersionCode(mContext));//记录当前版本号
                }

                @Override
                public void onCategoryChanged() {
                    // 加载分类
                    Category.getInstance(mContext, isVersionMark).init();
                }
            });
            configInfo.startConfigInfo();//请求配置
            /***    end   2016-03-09  ***/
        }
    }

}
